import axios from 'axios'
import {
	getLoginUser
} from '@/utils/storage'
import { Notification, MessageBox, Message, Loading } from 'element-ui'
import router from '@/router'

// const BASE_URL = 'http://localhost:3000/'
const BASE_URL = '/api/'

function getUrl(url) {
	if (url == null || url == undefined || url == '') {
		return
	}
	if (url.indexOf('/') == 0) {
		return BASE_URL + url.substring(1)
	}
	return BASE_URL + url
}

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
	// axios中请求配置有baseURL选项，表示请求URL公共部分
	// baseURL: process.env.VUE_APP_BASE_API,
	// 超时
	timeout: 1000000
})

service.interceptors.request.use(config => {
	// 是否需要设置 token
	const isToken = (config.headers || {}).isToken === false
	let user = getLoginUser();
	if (user && !isToken) {
		config.headers['Authorization'] = user.token // 让每个请求携带自定义token 请根据实际情况自行修改
	}
	config.url = getUrl(config.url);
	return config
}, error => {
	console.log(error)
	Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(
	res => {
		console.log('res', res)
		// 未设置状态码则默认成功状态
		// const code = (res.data.data && res.data.data.code) || 200;
		const code = (res.data && res.data.code) || 200;
		const msg = (res.data && res.data.msg) || '接口异常'
		// 二进制数据则直接返回
		if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
			return res.data
		}
		if (code === 401) {
			MessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
				confirmButtonText: '重新登录',
				cancelButtonText: '取消',
				type: 'warning'
			}).then(() => {
				router.push('/login')
			}).catch(() => {});
			return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
		} else if (code === 500) {
			Message({
				message: msg,
				type: 'error'
			})
			return Promise.reject(new Error(msg))
		} else if (code !== 200) {
			Notification.error({
				title: msg
			})
			return Promise.reject('error')
		} else {
			return res.data.data
		}
	},
	error => {
		console.log('err', error)
		let {
			message
		} = error;
		if (message == "Network Error") {
			message = "后端接口连接异常";
		} else if (message.includes("timeout")) {
			message = "系统接口请求超时";
		} else if (message.includes("Request failed with status code")) {
			message = "系统接口" + message.substr(message.length - 3) + "异常";
		}
		Message({
			message: message,
			type: 'error',
			duration: 5 * 1000
		})
		return Promise.reject(error)
	}
)

export default service;

export function post({
	url,
	data
}) {
	console.log('getUrl(url)', getUrl(url));
	return new Promise((resolve, reject) => {
		axios.request({
			url: getUrl(url),
			method: "post",
			headers: {},
			data
		}).then(res => {
			if (res.status == 200 && res.data && res.data.code == 200) {
				return resolve(res.data.data)
			}
			console.error('请求异常', res)
			return reject(res)
		}).catch(err => {
			return reject(err)
		})
	});
}
